/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：AppWebSocket.js<br>
 * 日期：2016年9月22日<br>
 * 作者: 王中山<br>
 * 功能：websocket 与插件化平台交互数据<br>
 * 
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 ******************************************************************************/

window.makeNamespace(window,"Rainier.UI.V2");

/**
 * 类型名称：Rainier.UI.V2.AppWebSocket<br>
 * 类型功能：websocket<br>
 * 接口函数：<br>
 * 成员变量：<br>
 */
Rainier.UI.V2.AppWebSocket = Rainier.Basic.CompositeObject.extend({
	
	NAME : "Rainier.UI.V2.AppWebSocket",
	
	/**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.init<br>
	 * 函数功能：构造函数<br>
	 * 异常信息：无<br>
	 */
	init : function(){
		this._super();
		
		this.webSocket 			= null;		//webSocket系统组件
		this.serialId  			= 0;		//消息序列号，每次发送命令后递增
		this.messageFactory 	= null;		//消息处理工厂(包含发送与接收消息处理)

		this.interFlag			= null;
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.connect<br>
	 * 函数功能：websocket连接服务器<br>
	 * 参数输入：无<br>
	 * 参数输出：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	connect : function(){
		this.reconnect();
		var _this = this;
		setTimeout(function(){
			if(_this.getReadyState() !== 1){
				if(confirm('平台运行所需插件没有正确的安装或运行。如未下载，请点击‘插件下载’，下载并安装；如已安装，请点击‘确定’启动插件。')){
					//alert('平台运行所需插件没有正确的安装或运行。如未下载，请点击‘插件下载’，下载并安装；如已安装，请点击‘确定’启动插件。');
					window.location = 'WebRainier:openRuntime';
					var count = 0;	
					_this.interFlag = setInterval(function(){
						var status = parseInt(_this.getReadyState());
						if(status !== 1){
							_this.reconnect();
							if (++count >= 5) {
								clearInterval(_this.interFlag);
								count = 0;
								console.log('clearInterval');
							}
						}
						else{
							clearInterval(_this.interFlag);
						}
					},2500);				
				}
			}
		},3000);
	},
		
	/**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.reconnect<br>
	 * 函数功能：websocket重新连接服务器<br>
	 * 参数输入：无<br>
	 * 参数输出：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	reconnect : function(){
		this.webSocket = new WebSocket('ws://localhost:9002');
		
		if(this.webSocket){
			this.webSocket.onerror = this.onError;
			this.webSocket.onopen = this.onOpen;
			this.webSocket.onmessage = $.proxy(this.onMessage,this);
			this.messageFactory = new Rainier.UI.V2.WebSocket.MessageHandlerFactory();
			this.messageFactory.initMessage();
		}
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.sendMsg<br>
	 * 函数功能：通过websocket发送消息并自增序列号<br>
	 * 参数输入：sMsg		消息字符串<br>
	 * 参数输出：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	sendMsg : function(sMsg){
		this.webSocket.send(sMsg);
		this.serialId += 1;
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.SendMsg<br>
	 * 函数功能：通过websocket发送消息<br>
	 * 参数输入：msgInfo		消息对象<br>
	 * 			msgInfo的定义存在共性，如{msg：''}
	 * 						也存在差异，如{needReturn:0/1,}
	 * 参数输出：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	sendMsgByInfo : function(msgInfo){
		if(msgInfo && msgInfo.type){
			var messageHandler = app.context.webSocket.messageFactory.getMessageHandlerByTag(msgInfo.type);
			var msg = messageHandler.formatMessage(msgInfo);
			this.sendMsg(msg);
		}
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.<br>
	 * 函数功能：打开事件<br>
	 * 参数输入：event		事件内容<br>
	 * 参数输出：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	onOpen : function(event) {
		console.log('webSocket open success');
    },

    /**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.<br>
	 * 函数功能：错误事件<br>
	 * 参数输入：event		事件内容<br>
	 * 参数输出：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
    onError : function onError(event) {
		console.log('webSocket error happened');
    },

    /**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.onMessage<br>
	 * 函数功能：接收消息事件<br>
	 * 参数输入：event		事件内容<br>
	 * 参数输出：无<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
    onMessage : function(event) {
        var msg = '';
        var xmlDoc; //XMLDocument
        msg = event.data;
        if(msg){
        	xmlDoc = $.parseXML(msg);
        	if(xmlDoc){
        		var msgType = xmlDoc.firstChild.tagName;
        		if(msgType){
        			//根据消息类型通过工厂调用相应的messageHandler
        			this.messageFactory.getMessageHandlerByTag(msgType).handleMsg(xmlDoc);
        		}
        	}
        }
    },
    
    /**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.getReadyState<br>
	 * 函数功能：获取当前websocket状态<br>
	 * 			CONNECTING  0
	 * 			OPEN		1
	 * 			CLOSING		2
	 * 			CLOSED		3
	 * 参数输入：<br>
	 * 参数输出：<br>
	 * 函数返回：<br>
	 * 异常信息：<br>
	 */
    getReadyState : function(){
    	return this.webSocket.readyState;
    },
    
    /**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.getSerialId<br>
	 * 函数功能：获取序列号，同一网页下序列号要保持一致<br>
	 * 参数输入：无<br>
	 * 参数输出：无<br>
	 * 函数返回：serialID ： int<br>
	 * 异常信息：无<br>
	 */
    getSerialId : function(){
    	return this.serialId;
    },
    
    /**
	 * 函数名称：Rainier.UI.V2.AppWebSocket.getMessageFactory<br>
	 * 函数功能：获取消息处理工厂<br>
	 * 参数输入：无<br>
	 * 参数输出：无<br>
	 * 函数返回：messageFactory<br>
	 * 异常信息：无<br>
	 */
    getMessageFactory : function(){
    	return this.messageFactory;
    },
    
});